package es.tikitaka.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import es.tikitaka.dao.TemporadaService;
import es.tikitaka.dictionary.AniosDic;
import es.tikitaka.domain.Temporada;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("temporadaService")
public class TemporadaServiceImpl implements TemporadaService {

	@In
	EntityManager em;

	/**
	 * Constructor por defecto
	 */
	public TemporadaServiceImpl() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método para listar todas las temporadas en el sistema
	 * 
	 * @return lista de temporadas
	 */
	@SuppressWarnings("unchecked")
	public List<Temporada> getList() {
		List<Temporada> list = null;
		try {
			list = em.createQuery(
					"select t from Temporada t order by t.anio.anio")
					.getResultList();
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * Método para listar todas las temporadas en el sistema que tienen asociado
	 * un calendario
	 * 
	 * @return lista de temporadas con calendario
	 */
	@SuppressWarnings("unchecked")
	public List<Temporada> getTemporadasCalendario() {
		List<Temporada> list = null;
		try {
			list = em
					.createQuery(
							"select t from Temporada t join fetch t.liga l join fetch l.calendario c where c is not null order by t.anio.anio")
					.getResultList();
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * Método para comprobar si existe una temporada para un año dado
	 * 
	 * @param anio
	 *            Año para el que comprobar si existe la temporada
	 * @return estado de la comprobación (true or false)
	 */
	public boolean existeTemporada(AniosDic anio) {

		boolean existe = false;
		Temporada tempo = null;

		try {
			tempo = (Temporada) em
					.createQuery(
							"select t from Temporada t left join fetch t.anio a where a.id = ?1 ")
					.setParameter("1", anio.getId()).getSingleResult();

			if (tempo != null) {
				existe = true;
			}
		} catch (NoResultException e) {
			// e.printStackTrace();
			existe = false;
		}

		return existe;

	}

	/**
	 * 
	 * @param temporada
	 * @return
	 */
	public Temporada merge(Temporada temporada) {
		em.refresh(temporada);
		return em.merge(temporada);
	}

	/**
	 * Método para eliminar una temporada del sistema
	 * 
	 * @param id
	 *            Id de la temporada a eliminar
	 * @return estado del proceso (true or false)
	 */
	public boolean delete(Integer id) {
		boolean correcto;
		try {
			Temporada temporada = em.getReference(Temporada.class, id);
			em.remove(temporada);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}

	/**
	 * Método para almacenar una temporada en el sistema o las modificaciones
	 * sufridas por una temporada ya existente
	 * 
	 * @param temporada
	 *            Temporada a almacenar
	 * @return estado del proceso (true or false)
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public boolean save(Temporada temporada) {
		boolean correcto;
		try {
			em.persist(temporada);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}
}
